package org.xenon.vote.service;

import org.springframework.stereotype.Service;

import org.xenon.vote.controller.TurnController;
import org.xenon.vote.dao.imp.ChoiceDao;
import org.xenon.vote.model.pojo.po.Choice;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Service
public class ChoiceService {
    private final ChoiceDao choiceDao;

    public ChoiceService(ChoiceDao choiceDao) {
        this.choiceDao = choiceDao;
    }

    /**
     * 获得一个轮次的所有选项
     */
    public List<Choice> getIntactChoice(int turn) {
        List<Choice> all = choiceDao.getAll(turn);
        return all.size() == 0 ? null : all;
    }

    /**
     * 获得一个轮次的所有选项
     */
    public List<String> getStringChoice(int turn) {
        List<Choice> choices = getIntactChoice(turn);
        if (choices == null) return null;
        List<String> strings = new ArrayList<>();
        for (Choice c : choices)
            strings.add(c.getDetail());
        return strings;
    }

    /**
     * 获得一个轮次的结果
     */
    public HashMap<String, Integer> getResult(int turn){
        List<Choice> choices = getIntactChoice(turn);
        if (choices == null) return null;
        HashMap<String, Integer> res = new HashMap<>();
        for (Choice c : choices)
            res.put(c.getDetail(), c.getScore());
        return res;
    }

    /**
     * 验证请求操作的选项是否属于本人
     *
     * @param id   选项ID
     * @param mail 请求者
     * @return 是否通过
     */
    public boolean checkByChoice(int id, String mail) {
        Choice choice = choiceDao.get(id);
        return choice.getOwner().equals(mail);
    }

    /**
     * 删除一些选项
     *
     * @param choices 目标的ID
     */
    public void del(List<Integer> choices, String mail) {
        for (int i : choices) del(i, mail);
    }

    /**
     * 删除一个选项
     *
     * @param id 目标的ID
     */
    public boolean del(int id, String mail) {
        Choice choice = choiceDao.get(id);
        if (!choice.getOwner().equals(mail)) return false;
        choiceDao.del(id);
        return true;
    }

    /**
     * 修改一个选项的内容
     *
     * @param id       目标的ID
     * @param contents 新的内容
     */
    public boolean editContents(int id, String contents, String mail) {
        Choice choice = choiceDao.get(id);
        if (choice == null) return false;
        if (!choice.getOwner().equals(mail)) return false;
        choice.setDetail(contents);
        choiceDao.edit(choice);
        return true;
    }

    /**
     * 修改一个选项的内容
     *
     */
    public boolean editContents(Choice choice) {
        try {
            choiceDao.edit(choice);
        }catch (Exception e){
            return false;
        }
        return true;
    }

    /**
     * 修改一个选项的顺序
     *
     * @param id    目标的ID
     * @param order 新的顺序
     */
    public void editOrder(int id, int order, String mail) {
        Choice choice = choiceDao.get(id);
        if (choice == null) return;
        if (!choice.getOwner().equals(mail)) return;
        choice.setOrder(order);
        choiceDao.edit(choice);
    }

    /**
     * 修改一些选项的内容
     *
     * @param choices ID, 新内容
     */
    public void edit(HashMap<Integer, String> choices, String mail) {
        for (int i : choices.keySet())
            editContents(i, choices.get(i), mail);
    }

    /**
     * 修改一些选项的内容
     *
     * @param choices ID, 新内容
     */
    public void edit(List<Choice> choices) {
        for (Choice i : choices)
            editContents(i);
    }
    public void edit(Choice[] choices) {
        for (Choice i : choices)
            editContents(i);
    }


    /**
     * 删除一个选项
     *
     * @param id 要删除的选项的ID
     */
    public void dropChoice(int id) {
        choiceDao.del(id);
    }

    /**
     * 注册一个选项
     *
     * @param turn   轮次
     * @param detail 内容
     * @param score  得票
     */
    public void add(int turn, String detail, String owner, int score) {
        choiceDao.add(new Choice(-1, turn, detail, getLatestOrder(turn) + 1, owner, score));
    }

    /**
     * 把所有选项添加
     *
     * @param turn    轮次
     * @param details 内容, 一行一个
     */
    public void addAll(int turn, String[] details, String mail) {
        int exist = getLatestOrder(turn);
        for (int i = 0; i < details.length; i++)
            choiceDao.add(new Choice(-1, turn, details[i], exist + i, mail, 0));
    }


    /**
     * 获取某轮次最新的一个选项序号
     *
     * @param turn 轮次号
     */
    public int getLatestOrder(int turn) {
        return choiceDao.getAll(turn).size();
    }
}
